package algorithm.leetcode.simple;

/*
 你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成，过去几回合的得分可能会影响以后几回合的得分。
 比赛开始时，记录是空白的。你会得到一个记录操作的字符串列表 ops，其中 ops[i] 是你需要记录的第 i 项操作，ops 遵循下述规则：
  1、整数 x - 表示本回合新获得分数 x
  2、"+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
  3、"D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
  4、"C" - 表示前一次得分无效，将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。

 */

import java.util.Stack;

/**
 * @author jack.wu
 * @version 1.0
 * @date 2021/2/2
 */
public class Question682 {

    public static void main(String[] args) {
        Question682 question = new Question682();
        String[] ops = {"5", "2", "C", "D", "+"};
        int points = question.calPoints(ops);
        System.out.println(points);
    }

    public int calPoints(String[] ops) {
        Stack<Integer> stack = new Stack<>();
        for (String o : ops) {
            switch (o) {
                case "C":
                    stack.pop();
                    break;
                case "D":
                    stack.push(stack.peek() * 2);
                    break;
                case "+":
                    int top = stack.pop();
                    int newTop = top + stack.peek();
                    stack.push(top);
                    stack.push(newTop);
                    break;
                default:
                    stack.push(Integer.valueOf(o));
            }
        }
        int sum = 0;
        while (!stack.isEmpty()) {
            sum += stack.pop();
        }
        return sum;
    }
}
